package produce.callback;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

/**
 * @author Kevin
 * @date 2023/6/11 16:21
 * @description mq消息消息确认回调
 **/
@Slf4j
@Configuration
public class MqCallback {

  @Autowired
  private RabbitTemplate rabbitTemplate;

//    @Bean
//    public MessageConverter messageConverter() {
//        return new Jackson2JsonMessageConverter();
//    }


  /**
   * @PostConstruct表示对象创建完成后调用此方法
   */
  @PostConstruct
  public void initRabbitTemplate(){
    //发送方确认回调
    rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
      /**
       * 无论是否找到匹配的交换机或者消息是否投递，都会执行
       * 只要消息抵达broker服务器 那么ack=true
       * @param correlationData 当前消息的唯一关联数据（这个是消息的唯一id）
       * @param ack 消息是否成功收到
       * @param cause 失败的原因
       */
      @Override
      public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        log.info("消息业务数据--{}",correlationData);

        if (ack){
          log.info("消息正确到达交换机");
          return;
        }

        log.error("消息没有达到交换机，原因为-{}",cause);
      }
    });

    //消息未抵达Queue的失败回调
    rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
      /**
       * 只要消息没有投递到指定的队列，就触发这个失败回调
       * @param message 投递失败的消息详细信息
       * @param replyCode 回复的状态码
       * @param replyText 回复的文本内容
       * @param exchange 当时这个消息发送给那个交换机
       * @param routingKey 当时这个消息用哪个路由键
       */
      @Override
      public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        log.info("投递失败的消息对象--{}",message);
        log.info("回复的状态码--{}",replyCode);
        log.info("回复的文本内容--{}",replyText);
        log.info("发往的交换机--{}",exchange);
        log.info("发往的路由key--{}",routingKey);
      }
    });

  }
}
